מבני נתונים ויעילות אלגוריתמים (8..05). טענה אודות סדר גודל. log טענה: מתקיים Θ(log) (!) = הוכחה: ברור שמתקיים: 3 4... 4 4 4... 43 פעמים במילים אחרות:! נוציא לוגריתם משני האגפים: log(!) log( ) log(a b ) = b נפעיל את הכלל log(a) על אגף ימין של האי-שוויון, ונקבל: log(! ) log(). log (!) = מכאן נובע שקיים החסם העליון: O(log) נותר להראות שקיים גם חסם, log ומזה ינבע החסם ההדוק שרצינו להראות. תחתון Ω(log) (!) = =!. מכאן ש: (+ Θ( )) כזכור, קירוב סטירלינג קובע ש:! e נוציא לוגריתם משני האגפים: log(!) log( ) נפעיל על אגף ימין של אי-השוויון את הכלל log(y), log(x (y = log(x) + ונקבל:
log(!) log( ) + log( ) להוציא שורש ריבועי שקול להעלאה בחזקת חצי: log(!) log(( ) 0.5 ) + log( ) : log(a b ) = b נשתמש פעמיים בכלל log(a) log(!) log( ) + log( ) e x log( ) = log(x) log( y) y נשתמש בכלל באגף ימין של האי-שוויון: log(! ) log( ) + log() log(e) באגף ימין של האי-שוויון יש שלושה מחוברים השמאלי מביניהם הוא מסדר גודל לוגריתמי, והימני מביניהם הוא מסדר גודל לינארי. המחובר האמצעי הוא הדומיננטי מבין השלושה, וסדר הגודל שלו הוא Θ(log)., log וסיימנו. המשמעות של האי-שוויון הזה, אם כך, היא ש- Ω(log) (!) = תרגיל מ.ש.ל חשבו את סיבוכיות זמן הריצה של כל אחד מקטעי הקוד הבאים: א. for (i = ; i <= ; i++) for (j = ; j <= log(); j++) S; ב. for (i = ; i <= ; i++) for (j = ; j <= log0(); j++) S;
ג. for (i = ; i <= ; i++) */ שימו לב /* j++) for (j = ; j <= log0(i); S; ד. for (i = ; i <= ; i++) { j = i; while (j > 0) { S; j = j / ; } }. חסם תחתון על זמן ריצה של מיוני השוואה כל אלגוריתמי המיון שראינו עד כה, הן הפחות יעילים מביניהם (מיון הכנסה, היעילים יותר (מיון-מיזוג ומיון עץ) סיבוכיותם הייתה מיון בחירה ומיון בועות), והן. Ω(log) מסתבר, שאין זה צירוף מקרים שלא הצלחנו למצוא אלגוריתם שסיבוכיותו טובה יותר, שכן זהו חסם תחתון עבור כל אלגוריתם מיון המבוסס על השוואות. אלגוריתמי מיון כאלה מכונים מיוני השוואה ) compariso.(sorts כל אלגוריתמי המיון שראינו עד כה היו מיוני השוואה. במיון השוואה משתמשים אך ורק בהשוואות בין איברים כדי לקבל מידע על סדר האיברים. כלומר, בהינתן שני איברים ו-,a j כדי לקבוע מהו הסדר שלהם, אנחנו מבצעים אחת מהבדיקות, > a j, = a j, < a j, < a j או a. i > a j איננו רשאים לבחון את ערכי האיברים או להשיג מידע על יחסי הסדר ביניהם בדרך אחרת. נניח, בלי הגבלת הכלליות, שכל האיברים במערך הקלט שונים זה מזה. בהינתן הנחה זו, לא נזדקק להשוואות מהצורה. = a j 3
כמו כן, תחת ההנחה שאין שני איברים שווים, לא יהיה הבדל בין השוואה מהצורה מהצורה < a j > a j לבין השוואה מהצורה > a j או בין השוואה מהצורה, < a j לבין השוואה. לפיכך, נוכל להניח כי לא מתבצעות השוואות מהסוג < a j או מהסוג. > a j לבסוף, נשים לב שההשוואות < a j ו- > a j שקולות זו לזו, במובן זה שהן מספקות מידע זהה על הסדר היחסי של ו-.a j לפיכך, נניח שכל ההשוואות הן מהצורה. < a j עץ החלטה מייצג את trees).(decisio באמצעות עצי החלטה עצי החלטה ניתן לתאר מיוני השוואה באופן מופשט, ההשוואות שמבצע אלגוריתם מיון כשהוא פועל על קלט בגודל נתון. נביט בעץ ההחלטה הבא, המתאר את פעולתו של אלגוריתם מיון, המבוסס על השוואות, על קלט של שלושה איברים: באופן כללי, בהינתן סדרת קלט ),(a, a,, a כל צומת פנימי בעץ ההחלטה יסומן, : a j בעבור < i, j <. כל עלה מייצג תמורה (permutatio) של האיברים. ביצוע של אלגוריתם המיון מתאים למעבר לאורך מסלול, משורש עץ ההחלטה לאחד העלים. בכל צומת פנימי נערכת ההשוואה < a j התת-עץ השמאלי מכתיב את ההשוואות הבאות שיערכו אם a, i < a j ואילו התת-העץ הימני מכתיב את ההשוואות הבאות שיערכו אם <. a j כאשר מגיעים אל עלה, אלגוריתם המיון קבע את סדר המיון. גובהו של עץ החלטה ראינו שעבור עץ החלטה עם שלושה איברים, היו = 6!3 עלים. כמו כן, ברור שכל הצמתים הם מדרגה 0 או מדרגה. זהו המצב גם באופן כללי: בעץ החלטה עבור מערך המכיל איברים, יש! עלים, ובעץ כזה כל הצמתים הם מדרגה 0 או. 4
לפי המשפט העיקרי על עצים בינאריים, מספר העלים גדול ב- ממספר הצמתים בעלי דרגה. מכיוון שיש! עלים, נסיק שיש! צמתים מדרגה. כמות הצמתים הכוללת בעץ שווה לסכום של כמות העלים ושל כמות הצמתים מדרגה (כי בעץ החלטה אין צמתים מדרגה ). לכן:! =! +! = כמות הצמתים בעץ. x+ log ( ) h h מקיים: x כעת, ניזכר במסקנה אותה הוכחנו, לפיה בעץ בינארי בעל צמתים, הגובה נציב!,x = ונקבל: x+!-+! log ( ) = log ( ) = log ( ) h = log (!). h = Ω(log) ולכן, log מתקיים Θ(log) (!) = כשמבצעים מיון בעזרת השוואות, גובהו של עץ ההחלטה דהיינו, אורכו של המסלול הארוך ביותר מהשורש של העץ לאחד מעליו מייצג את מספר ההשוואות שאלגוריתם המיון עורך במקרה הגרוע ביותר.(W.C Worst Case) מכיוון שהוכחנו כי הגובה h של כל עץ החלטה מקיים Ω(log), h = נסיק שזהו חסם תחתון לסיבוכיות זמן הריצה, במקרה הגרוע ביותר (W.C) של מיון, במודל ההשוואות. תרגיל האם קיים אלגוריתם המבוסס על השוואות, שזמן ריצתו הוא לינארי,(W.C) אשר בהינתן מערך קלט, בונה ממנו עץ חיפוש בינארי? אם כן כתבו את האלגוריתם, ואם לא הוכיחו שאלגוריתם כזה לא יכול להתקיים. 5